#pragma once

#include <netinet/tcp.h>  // TCP_NODELAY
#include <sys/socket.h>    // socket相关函数
#include "InetAddress.h"   // 前文实现的InetAddress类


int createnonblocking();

class Socket
{
private:
    const int fd_;         // Socket持有的文件描述符
    
public:
    explicit Socket(int fd); // 构造函数，传入已准备好的文件描述符
    ~Socket();              // 析构函数，关闭文件描述符

    int fd() const;         // 返回文件描述符

    // 套接字选项设置
    void setreuseaddr(bool on);   // 设置SO_REUSEADDR选项
    void setreuseport(bool on);   // 设置SO_REUSEPORT选项
    void settcpnodelay(bool on);  // 设置TCP_NODELAY选项
    void setkeepalive(bool on);   // 设置SO_KEEPALIVE选项

    // 服务器端功能
    void bind(const InetAddress& servaddr); // 绑定地址
    void listen(int nn = 128);              // 开始监听
    int accept(InetAddress& clientaddr);     // 接受连接并返回客户端套接字fd
};